package utils

import (
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"strings"
)

// FileManager 文件管理器
type FileManager struct {
	currentFile string
	content     string
	isModified  bool
}

// NewFileManager 创建新的文件管理器
func NewFileManager() *FileManager {
	return &FileManager{
		currentFile: "",
		content:     "",
		isModified:  false,
	}
}

// NewFile 创建新文件
func (fm *FileManager) NewFile() {
	fm.currentFile = ""
	fm.content = ""
	fm.isModified = false
}

// OpenFile 打开文件
func (fm *FileManager) OpenFile(filePath string) error {
	// 检查文件是否存在
	if _, err := os.Stat(filePath); os.IsNotExist(err) {
		return fmt.Errorf("文件不存在: %s", filePath)
	}

	// 读取文件内容
	content, err := ioutil.ReadFile(filePath)
	if err != nil {
		return fmt.Errorf("读取文件失败: %v", err)
	}

	// 转换为字符串
	fm.content = string(content)
	fm.currentFile = filePath
	fm.isModified = false

	return nil
}

// SaveFile 保存文件
func (fm *FileManager) SaveFile(filePath string) error {
	if filePath == "" {
		return fmt.Errorf("文件路径不能为空")
	}

	// 确保目录存在
	dir := filepath.Dir(filePath)
	if err := os.MkdirAll(dir, 0755); err != nil {
		return fmt.Errorf("创建目录失败: %v", err)
	}

	// 写入文件
	err := ioutil.WriteFile(filePath, []byte(fm.content), 0644)
	if err != nil {
		return fmt.Errorf("保存文件失败: %v", err)
	}

	fm.currentFile = filePath
	fm.isModified = false

	return nil
}

// SaveAsFile 另存为文件
func (fm *FileManager) SaveAsFile(filePath string) error {
	return fm.SaveFile(filePath)
}

// SetContent 设置内容
func (fm *FileManager) SetContent(content string) {
	fm.content = content
	fm.isModified = true
}

// GetContent 获取内容
func (fm *FileManager) GetContent() string {
	return fm.content
}

// IsModified 检查是否已修改
func (fm *FileManager) IsModified() bool {
	return fm.isModified
}

// GetCurrentFile 获取当前文件路径
func (fm *FileManager) GetCurrentFile() string {
	return fm.currentFile
}

// GetFileName 获取文件名
func (fm *FileManager) GetFileName() string {
	if fm.currentFile == "" {
		return "未命名"
	}
	return filepath.Base(fm.currentFile)
}

// GetFileExtension 获取文件扩展名
func (fm *FileManager) GetFileExtension() string {
	if fm.currentFile == "" {
		return ""
	}
	return strings.ToLower(filepath.Ext(fm.currentFile))
}

// IsTextFile 检查是否为文本文件
func (fm *FileManager) IsTextFile() bool {
	ext := fm.GetFileExtension()
	textExtensions := []string{
		".txt", ".md", ".json", ".xml", ".html", ".css", ".js",
		".py", ".go", ".java", ".cpp", ".c", ".h", ".hpp",
		".cs", ".php", ".rb", ".pl", ".sh", ".bat", ".ps1",
		".log", ".ini", ".cfg", ".conf", ".yaml", ".yml",
	}

	for _, textExt := range textExtensions {
		if ext == textExt {
			return true
		}
	}

	return false
}

// GetFileSize 获取文件大小
func (fm *FileManager) GetFileSize() int64 {
	return int64(len(fm.content))
}

// GetFileSizeString 获取文件大小的字符串表示
func (fm *FileManager) GetFileSizeString() string {
	size := fm.GetFileSize()
	return formatFileSize(size)
}

// formatFileSize 格式化文件大小
func formatFileSize(size int64) string {
	const (
		KB = 1024
		MB = KB * 1024
		GB = MB * 1024
	)

	switch {
	case size >= GB:
		return fmt.Sprintf("%.2f GB", float64(size)/GB)
	case size >= MB:
		return fmt.Sprintf("%.2f MB", float64(size)/MB)
	case size >= KB:
		return fmt.Sprintf("%.2f KB", float64(size)/KB)
	default:
		return fmt.Sprintf("%d 字节", size)
	}
}

// GetLineCount 获取行数
func (fm *FileManager) GetLineCount() int {
	if fm.content == "" {
		return 0
	}

	lines := strings.Split(fm.content, "\n")
	return len(lines)
}

// GetWordCount 获取单词数
func (fm *FileManager) GetWordCount() int {
	if fm.content == "" {
		return 0
	}

	// 简单的单词计数，按空格分割
	words := strings.Fields(fm.content)
	return len(words)
}

// GetCharCount 获取字符数
func (fm *FileManager) GetCharCount() int {
	return len(fm.content)
}

// GetCharCountNoSpaces 获取不含空格的字符数
func (fm *FileManager) GetCharCountNoSpaces() int {
	return len(strings.ReplaceAll(fm.content, " ", ""))
}
